Comment puis-je créer dynamiquement
des pages dans un tpagecontrol ?

Créer un nouveau projet,

Première étape: Enregistrer la classe TTabsheet

 

registerclasses([TTabSheet]);

 

Deuxièmement: Mettre un composant
tpagecontrol sur la fiche principale, créer
une nouvelle page dans le tpagecontrol et mettez
les composants souhaités dans cette page.

Troisièmement: Créer le fichier
de ressources contenant la page qui sera
affichée à l'exécution.

Suivez les instructions ci-dessous

Vous devez changer la propriété parent
des composants que vous avez sur la page à
afficher dynamiquement. Ici, "Self" est la fiche
principale.

 

var i:integer; c:Tcomponent;
begin

for i := 0 to tabsheet1.Controlcount - 1 do
begin
c := tabsheet1.Controls[i];
Self.RemoveComponent(c);
tabsheet1.InsertComponent(c);
end;

saveToStream(Sender);
end;

Quatrièmement, vous devez enregistrer
la page dans un fichier.

 

procedure TForm1.SaveToStream(Sender: TObject);
var
AStream: TMemoryStream;
begin
if SaveDialog1.execute then
begin
//GuiToObject;
AStream := TMemoryStream.Create;
try
AStream.WriteComponent(tabsheet1);
AStream.SaveToFile(SaveDialog1.FileName);
finally
AStream.free;
end;
end;
end;

Vous devez mettre ce fichier dans un fichier
de resource. Créer un nouveau fichier.
Appelez-le Tabsheet.rc

MyTabSheet RCDATA "NomFichierEtape4"

Run this command

brcc32 tabsheet.rc
Vous obtenez "tabsheet.res"

Enregistrez le projet si vous le souhaitez.
Vous êtes; prêt à créer
des pages dynamiques dans votre application.

Cinquièmement, vous enregistrez la classe TPageControl
et la classe des composantes que vous avez
placez dans votre page

 

RegisterClasses([TTabSheet]);
RegisterClasses([TListView]);
//Si vous avez mis un tlistview

Donc, pour créer une page dans
un Tpagecontrol, vous appelez la fonction
OpenNewTab with comme premier paramètre
"MyTabSheet"

 

uses classes, windows;

function OpenNewTab(resourcename:string;
pagecontrol:TPageControl;
sheetcaption:string):TTabSheet;
//retourne une page (TTabsheet)

var
ms: TMemoryStream;
sheet: TTabSheet;

begin
sheet:=nil;
ms := TMemoryStream.Create;
try

GetResourceInStream(resourcename,ms);
sheet := ms.ReadComponent(nil) as TTabsheet;

sheet.Pagecontrol := pagecontrol;
//Vous attachez la page au TPagecontrol
sheet.Caption := sheetcaption;
//Vous lui donnez un titre
sheet.TabVisible:=true;

finally
ms.free
end;
result:=sheet;
end;

function GetResourceInStream(resourcename:string;
stream:TMemoryStream):boolean;
var
ResHandle : THandle;
MemHandle : THandle;
ResPtr : PByte;
ResSize : Longint;
begin
ResHandle := FindResource(0,
PAnsiChar(resourcename),RT_RCDATA);
MemHandle := LoadResource(Hinstance, ResHandle);
ResPtr := LockResource(MemHandle);
ResSize := SizeOfResource(Hinstance, ResHandle);
stream.SetSize(ResSize);
stream.Write(ResPtr^, ResSize);
FreeResource(MemHandle);
stream.position:=0;
end;

N.B : Si vous voulez fermer une page, vous devez mettre la propriété parent à nil avant d'appeler la méthode "free" ou vous aurez des violations d'accès

Retour vers l'index delphi